/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[][]}
 */
 var fourSum = function(nums, target) {
  let len = nums.length // 数组的长度
  nums.sort((a,b)=>a - b) // 升序排列
  let res = [] // 结果数组
  for(let i = 0;i < len - 3;i++){ // 从0 到len-3
     if(i > 0 && nums[i] === nums[i-1]) continue // 如果这个数字和前面的相同 那就直接继续下一个
     for(let j = i + 1;j < len - 2;j++){
        if(j > i + 1 && nums[j] === nums[j-1]) continue // 如果这个数字等于前面的一个 那就直接继续下一次循环
        let left = j + 1 // 左边界是j+1
        let right = len - 1 // 右边界是len-1
        while(left < right){ // 当做小于右边的时候
           let sum = nums[i] + nums[j] + nums[left] + nums[right] // 计算出四个数字的和
           if(sum > target){ // 如果这个和大于target 就让右边界--
              right--
           }else if(sum < target){ // 如果这个和小于target 就让左边界++
              left++
           }else{
              res.push([nums[i] , nums[j] ,nums[left] , nums[right]]) // 放入结果数组
              while(left < right && nums[left] === nums[left+1]){ // 让座边界移动到不同于当前的值的位置
                 left++
              }
              while(left < right && nums[right] === nums[right-1]){ // 让右边界移动到不同于当前的值的位子
                 right--
              }
              left++
              right--
           }
        }
     }
  }
  return res
};